#include "config.h"
#include <QFileInfo>
#include <QDir>
#include <QDebug>

Config *Config::m_instance = nullptr;
QMutex Config::m_mutex;

Config::Config(QObject *parent)
    : QObject(parent), m_settings(nullptr)
{
}

Config::~Config()
{
    if (m_settings)
    {
        m_settings->sync();
        delete m_settings;
    }
}

// 获取配置单例
Config *Config::instance()
{
    if (m_instance == nullptr)
    {
        QMutexLocker locker(&m_mutex);
        if (m_instance == nullptr)
        {
            m_instance = new Config();
        }
    }
    return m_instance;
}

// 初始化配置系统
bool Config::initialize(const QString &configFilePath)
{
    QMutexLocker locker(&m_mutex);

    m_configFilePath = configFilePath;

    // 检查配置文件是否存在
    QFileInfo fileInfo(configFilePath);
    if (!fileInfo.exists())
    {
        qWarning() << "配置文件不存在:" << configFilePath;
        return false;
    }

    // 创建 QSettings 对象
    if (m_settings)
    {
        delete m_settings;
    }

    m_settings = new QSettings(configFilePath, QSettings::IniFormat);
    m_settings->setIniCodec("UTF-8");

    qInfo() << "配置文件加载成功:" << configFilePath;
    return true;
}

// 获取配置值（内部使用）
QVariant Config::getValue(const QString &key, const QVariant &defaultValue) const
{
    QMutexLocker locker(&m_mutex);

    if (!m_settings)
    {
        qWarning() << "配置系统未初始化";
        return defaultValue;
    }

    return m_settings->value(key, defaultValue);
}

// 设置配置值（内部使用）
void Config::setValue(const QString &key, const QVariant &value)
{
    QMutexLocker locker(&m_mutex);

    if (!m_settings)
    {
        qWarning() << "配置系统未初始化";
        return;
    }

    m_settings->setValue(key, value);
    emit configChanged(key, value);
}

// 保存配置到文件
void Config::save()
{
    QMutexLocker locker(&m_mutex);

    if (m_settings)
    {
        m_settings->sync(); // 同步配置到文件
        qInfo() << "配置已保存到文件";
    }
}

// ========== 串口配置 ==========

QString Config::getSerialPort1() const
{
    return getValue("Serial/Port1", "COM1").toString();
}

QString Config::getSerialPort2() const
{
    return getValue("Serial/Port2", "COM3").toString();
}

QString Config::getSerialPort3() const
{
    return getValue("Serial/Port3", "COM5").toString();
}

int Config::getBaudRate() const
{
    return getValue("Serial/BaudRate", 115200).toInt();
}

// 串口配置设置方法
void Config::setSerialPort1(const QString &port)
{
    setValue("Serial/Port1", port);
}

void Config::setSerialPort2(const QString &port)
{
    setValue("Serial/Port2", port);
}

void Config::setSerialPort3(const QString &port)
{
    setValue("Serial/Port3", port);
}

void Config::setBaudRate(int baudRate)
{
    setValue("Serial/BaudRate", baudRate);
}

// ========== Modbus 配置 ==========

int Config::getModbusTimeout() const
{
    return getValue("Modbus/Timeout", 1000).toInt();
}

int Config::getPollInterval() const
{
    return getValue("Modbus/PollInterval", 500).toInt();
}

// ========== 数据库配置 ==========

QString Config::getDatabasePath() const
{
    // 使用绝对路径作为默认值，避免工作目录问题
    return getValue("Database/Path", "C:/Users/86188/Desktop/ModbusPro/QModbusPowerCloud/data/powercloud.db").toString();
}

// ========== 巴法云配置 ==========

QString Config::getBemfaHost() const
{
    return getValue("Bemfa/Host", "bemfa.com").toString();
}

int Config::getBemfaPort() const
{
    return getValue("Bemfa/Port", 8344).toInt();
}

QString Config::getBemfaUid() const
{
    return getValue("Bemfa/Uid", "").toString();
}

// 主题配置（按配电室分配）
QString Config::getBemfaTopic1() const
{
    return getValue("Bemfa/Topic1", "powercloud001").toString();
}

QString Config::getBemfaTopic2() const
{
    return getValue("Bemfa/Topic2", "powercloud002").toString();
}

QString Config::getBemfaTopic3() const
{
    return getValue("Bemfa/Topic3", "powercloud003").toString();
}

// 推送间隔配置
int Config::getBemfaHeartbeatInterval() const
{
    return getValue("Bemfa/HeartbeatInterval", 60).toInt(); // 60秒
}

int Config::getBemfaDataPushInterval() const
{
    return getValue("Bemfa/DataPushInterval", 60).toInt(); // 60秒
}

int Config::getBemfaFullDataUploadInterval() const
{
    return getValue("Bemfa/FullDataUploadInterval", 300).toInt(); // 300秒
}

bool Config::isBemfaEnabled() const
{
    return getValue("Bemfa/Enabled", false).toBool(); // 默认关闭
}

// ========== 日志配置 ==========

QString Config::getLogLevel() const
{
    return getValue("Log/Level", "Info").toString();
}

bool Config::isLogConsoleEnabled() const
{
    return getValue("Log/ConsoleOutput", true).toBool();
}
